package com.example.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component;

/**
 * 内嵌Tomcat增强配置
 * 
 * @author xyzhou2
 *
 */
@Component
public class MyTomcatEmbeddedServletContainerFactory extends
        TomcatEmbeddedServletContainerFactory {

    protected void customizeConnector(Connector connector) {
        super.customizeConnector(connector);

        // 禁用DNS查询
        // connector.setEnableLookups(false);

        // character encoding to use for URL decoding
        connector.setURIEncoding("UTF-8");

        // NIO协议
        Http11NioProtocol protocol = (Http11NioProtocol) connector
                .getProtocolHandler();
        // 设置最大线程数
        protocol.setMaxThreads(768);

        // 始终保持运行最小线程数
        protocol.setMinSpareThreads(512);

        // 设置连接超时时间，单位秒
        protocol.setConnectionTimeout(5000);

        // 设置最大连接数
        protocol.setMaxConnections(1024);

        // 此连接器在关闭连接之前将等待另一个HTTP请求的毫秒数
        protocol.setKeepAliveTimeout(300000);

        // HTTP请求最大长连接个数
        protocol.setMaxKeepAliveRequests(768);

        // 连接器可以使用HTTP/1.1 GZIP压缩
        protocol.setCompression("on");
        protocol.setCompressionMinSize(1024);
        protocol.setCompressableMimeType("text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/xml");

        // 此标志允许servlet容器在数据上传时使用不同的连接超时，通常较长。如果没有指定，该属性被设置为true，禁用上传超时
        protocol.setDisableUploadTimeout(false);

        // 上传数据过程中，指定的以毫秒为单位超时时间。只有在设置disableUploadTimeout为false有效，默认300秒 。
        protocol.setConnectionUploadTimeout(300 * 1000);

        // 用于接收请求的线程数。在多CPU机器上可以提高该数值。默认值为1，一般不做修改，官方建议不要超过2
        protocol.setAcceptorThreadCount(1);
    }

}
